import os
import re
import pandas as pd
import pdfplumber
from dateutil.parser import parse
import tkinter as tk
from tkinter import filedialog
import openpyxl

# 用户打开窗口选择行程单的PDF文件路径，程序获取路径下所有PDF文件
# PDF中是用户打车的行程记录
# 记录中包含：序号 车型 上车时间 城市 起点 终点 里程[公里] 金额[元] 备注 的信息
# 请用程序解析PDF文件，并将行程记录存储成字典
def extract_itinerary_from_pdf(pdf_path):
    itinerary_records = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text = page.extract_text()
            print(text)
            lines = text.split('\n')
            # text中包含行程起止日期的字符串的冒号后面的数据保存为一个字符串
            # 例如：行程起止日期：2024-11-02 至 2024-11-03,提取'2024-11-02 至 2024-11-03'
            date_range_match = re.search(r'行程起止日期[:：]\s*([\d\-]+ 至 [\d\-]+)', text)
            if date_range_match:
                trip_date_range = date_range_match.group(1).strip()
            else:
                trip_date_range = None

            tables = page.extract_tables()
            print(tables[0])
            # 在tables[0]中的第一个元素是表格的列标签，其余元素是表格数据
            # 把此数据转换成字典，字典的键值就是列标签，值就是每一个行的数据
            if tables:
                headers = tables[0][0]
                for row in tables[0][1:]:
                    # 将row中的数据与headers中的列标签对应起来，组成一个字典
                    # 例如：{'序号': '1', '车型': '舒适型', '上车时间': '2021-08-01 08:00', '城市': '北京', '起点': '首都机场', '终点': '天安门', '里程[公里]': '30', '金额[元]': '100', '备注': '无'}
                    # row中的数据含有\n，需要替换成空格
                    row = [re.sub(r'\n', ' ', r) for r in row]
                    record = {headers[i]: row[i] for i in range(len(headers))}
                    record['行程起止日期'] = trip_date_range
                    itinerary_records.append(record)
    return itinerary_records

# Example usage
# 弹出选择文件夹窗口
root = tk.Tk()
root.withdraw()  # Hide the root window
pdf_directory = filedialog.askdirectory(title="选择PDF文件夹")
#判断用户是否选择了文件夹
if not pdf_directory:
    print('未选择文件夹')
    exit()
pdf_files = [os.path.join(pdf_directory, f) for f in os.listdir(pdf_directory) if f.endswith('.pdf')]
all_itineraries = []
for pdf_file in pdf_files:
    all_itineraries.extend(extract_itinerary_from_pdf(pdf_file))

# Convert to DataFrame for further processing if needed
df = pd.DataFrame(all_itineraries)
print(df)
# 将DataFrame保存为Excel文件
#弹出保存文件对话框
file_path = filedialog.asksaveasfilename(title="保存文件", filetypes=[('Excel', '*.xlsx')])
if not file_path:
    print('未选择保存文件')
    exit()
print(file_path)
df.to_excel(file_path + ".xlsx", index=False)

